package com.ht.api.db.remote;

import java.io.File;
import java.nio.charset.StandardCharsets;

import com.ht.api.db.bean.AjaxResult;

import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;

/**
 * 第三方接口工具类
 * @author asq
 * @createTime 2024年12月16日 10:38:36
 */
@Slf4j
public class ApiUtil {
	/** 远程接口调用频率检查 */
	private static ApiConfig apiConfig = SpringUtil.getBean(ApiConfig.class);
	
	/**
	 * get方式调用第三方接口
	 * @param url 接口路径
	 * @return
	 */
	
	public static String get(String url){
		return sendRequest(url, Method.GET, null, null, null);
	}
	
	/**
	 * get方式调用第三方接口，携带参数
	 * @param url
	 * @param param 参数
	 * @return
	 */
	public static String get(String url, JSONObject param){
		return sendRequest(url, Method.GET, null, param, null);
	}
	
	/**
	 * post方式调用第三方接口
	 * @param url 接口路径
	 * @return
	 */
	public static String post(String url){
		return sendRequest(url, Method.POST, null, null, null);
	}
	
	/**
	 * post方式调用第三方接口
	 * @param url 接口路径
	 * @param body 参数
	 * @return
	 */
	public static String post(String url, JSONObject body){
		return sendRequest(url, Method.POST, null, null, body);
	}
	
	/**
	 * post方式调用第三方接口
	 * @param url 接口路径
	 * @param httpHeaders 请求头
	 * @param body 参数
	 * @return
	 */
	public static String post(String url, JSONObject httpHeaders, JSONObject body){
		return sendRequest(url, Method.POST, httpHeaders, null, body);
	}
	
	/**
	 * 发送一个请求
	 * @param url 地址
	 * @param method 方法
	 * @param headers header头
	 * @param form form参数
	 * @param body body参数
	 * @return
	 */
	public static String sendRequest(String url, Method method, JSONObject headers, JSONObject form, JSONObject body) {
	    try {
	        // 0. 检查请求频率
	        AjaxResult rb = apiConfig.checkRateLimit(url);
	        if (!rb.isSuccess()) {
	            log.warn("[ApiUtil]第三方接口请求频率已达阈值：{}", rb.getMsg());
	            throw new RuntimeException(rb.getMsg());
	        }
	        
	        // 1. 构建URL参数
	        String finalUrl = url;
	        if (form != null && !form.isEmpty()) {
	            finalUrl = HttpUtil.urlWithForm(url, form, StandardCharsets.UTF_8, true);
	        }
	      	if (method == Method.GET && body != null) {
	      		finalUrl = HttpUtil.urlWithForm(finalUrl, body, StandardCharsets.UTF_8, true);
	      		body = null;
        	}

	        // 2. 创建请求对象
	        HttpRequest request = switch (method) {
	            case GET -> HttpUtil.createGet(finalUrl);
	            case POST -> HttpUtil.createPost(finalUrl);
	            default -> throw new RuntimeException("不支持的 HTTP 方法: " + method);
	        };
	        
	        // 3. 设置请求头
	        if (headers != null) {
	            headers.forEach((key, value) -> request.header(key, value.toString()));
	        }
	        // 默认设置JSON内容类型
	        request.header("Content-Type", "application/json");

	        // 4. 设置请求体
	        if (body != null) {
	        	request.body(body.toString());
	        }

	        // 5. 发送请求并获取响应
	        HttpResponse response = request.execute();
	        
	        // 6. 处理响应
	        String result = response.body();
			if (response.isOk()) {
				log.info("[ApiUtil]请求第三方接口：{}\n参数：{}\n返回：{}", finalUrl, body != null ? body.toString() : "{}", result);
	            return result;
	        } else {
				log.error("[ApiUtil]第三方接口请求失败：{}\n参数：{}\n返回：{}\n状态码：{}", finalUrl, body != null ? body.toString() : "{}", 
						result, response.getStatus());
	            throw new RuntimeException("第三方接口请求失败，状态码：" + response.getStatus());
	        }

	    } catch (Exception e) {
	        log.error("[ApiUtil]第三方接口请求发生异常: {}", url, e);
	        throw new RuntimeException("第三方接口请求发生异常", e);
	    }
	}
	
	/**
     * 上传文件到远程服务器
     * @param url 上传地址
     * @param File 文件
     * @return 服务器响应结果
     */
    public static String uploadFile(String url, File file) {
        try {
        	if (file == null) {
        		log.warn("[ApiUtil]上传文件为null，忽略上传~");
        		return "";
        	}
        	
            // 发送请求
            HttpResponse response = HttpRequest.post(url).form("media", file).execute();
	        
	        // 处理响应
	        String result = response.body();
			if (response.isOk()) {
				log.info("[ApiUtil]上传文件到第三方接口，url：{}\n文件名：{}\n返回：{}", url, file.getName(), result);
	            return result;
	        } else {
	            log.error("[ApiUtil]上传文件到第三方接口失败，url：{}\n文件名：{}\n返回：{}\n状态码：{}", url, file.getName(), 
	            		result,	response.getStatus());
	            throw new RuntimeException("上传文件到第三方接口失败，状态码：" + response.getStatus());
	        }
        } catch (Exception e) {
	        log.error("[ApiUtil]上传文件到第三方接口发生异常: {}", url, e);
	        throw new RuntimeException("上传文件到第三方接口发生异常", e);
        }
    }
}
